{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[5, 1], [4, 2], [2, 5], [1, 4], [3, 2], [2, 5]])  # 电影A和电影B的评分数据\n",
    "\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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gF2CEhEREclvNhdFnTp1YtasWZb3JpOJxMREJk6cSNeuXe0Zm4iIiEi+sfn02VtvvUXnzp2pWbMmN27coH///hw8eJBSpUrx+eefOyJGEREREYezuSgqX748v/32G4sWLeL3338nMTGRoUOHMmDAAKuJ1yIiIiKFic1FEYCHhwcPP/ywvWMRERERcZocFUXffvst999/P56ennz77bfZtu3Ro4ddAhMRERHJTzkqiiIjIzlz5gxBQUFERkZm2c5kMmV6ZZqIiIhIQZejoig1NTXTv4uIiIi4CpsvyT9x4oQj4hARERFxKpuLotDQUNq0acOHH37IpUuXHBGTiIiISL6zuSjatm0bTZo0YcqUKZQpU4bIyEi++uorkpKSHBGfiIiISL6wuShq0KABM2bM4Pjx46xcuZJ77rmHxx9/nNKlSzNkyBBHxCgiIiLicDYXRelMJhPt2rXjww8/ZM2aNVSqVImPP/7YnrGJiIiI5JtcF0UnT57kjTfeoH79+jRp0gR/f3/mzJljz9hERERE8o3Nd7SeN28e0dHRbNq0ibCwMAYMGMA333xDxYoVHRGfiIiISL6wuSh65ZVX6NevH++88w716tVzREwiIiIi+c7mouj48eOYTCZHxCIiIiLiNDYXRSaTicuXLzN//nz2798PQM2aNRk6dChFixa1e4AiIiIi+SFX9ymqXLkyM2fO5OLFi1y8eJGZM2dSuXJlduzY4YgYRURERBzO5pGiZ599lh49evDhhx/i4ZG2+c2bNxk2bBijRo1i/fr1dg9SRERExNFsLoq2bdtmVRABeHh4MHbsWBo1amTX4ERERETyi82nzwIDAzl+/HiG5SdOnCAgIMAuQYmIiIjkN5uLor59+zJ06FC++OILTpw4wYkTJ1i0aBHDhg2jX79+johRRERExOFsLorefPNNevXqxcCBAwkNDSU0NJTBgwfz0EMP8frrr9vU17Rp02jcuDEBAQEEBQURGRnJgQMHst0mKioKk8lk9fLx8bE1DRERERErNs8p8vLyYvbs2UybNo3Dhw8DULlyZfz8/Gze+bp16xg+fDiNGzfm5s2bjB8/nk6dOrFv3z6KFCmS5XaBgYFWxZPumyQiIiJ5ZXNRlM7Pz486derkaeerVq2yeh8VFUVQUBDbt2+ndevWWW5nMpkIDg7O075FREREbpXjomjIkCE5ardg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1KpVC29vb86fP2/VxtPT0+Z+b1e9enVu3rzJzp07LcsOHTrEpUuX8tSviOSeiiIRyZS7uzv79+9n3759VqeA0hUpUoQnn3ySMWPGsGrVKvbt28djjz3GtWvXGDp0qKVdaGgozZs3Z+jQoZjNZnr06JHlPgcMGECpUqXo2bMnGzZs4MiRI8TGxvLMM89w8uTJTLeZP38+Dz30ELVr17Z6DR06lPPnz7Nq1Sqb8q5atSqffvop+/fv55dffmHAgAH4+vpatQkNDWXt2rWcOXMm10VMWFgYHTp04PHHH+fXX39l586dPP7445mOXolI/lBRJCJZCgwMJDAwMMv106dP58EHH+SRRx4hPDycQ4cOsXr16gzzYgYMGMBvv/3GAw88kKHAuJWfnx/r16+nQoUK9OrVixo1ajB06FBu3LiRaRzbt2/nt99+48EHH8ywrmjRorRv35758+fbkHFakXXp0iXCw8N55JFHLLccuNVbb71FTEwMISEhGW5TYItPPvmE0qVL07p1ax544AEee+wxAgIC8PHxyXWfIpJ7JsMwDGcHISIicPLkSUJCQlizZg3t27d3djgidx0VRSIiTvLjjz+SmJhInTp1iIuLY+zYsZw6dYo///wzwyRtEXE8XX0mIuIkKSkpjB8/nr/++ouAgACaN2/OZ599poJIxEk0UiQiIiKCJlqLiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiADw/yEXoLrTXwjkAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，不同的影片喜好类别用不同的颜色标记\n",
    "plt.scatter(X[y == 0, 0], X[y == 0, 1], c='blue', label='Action')\n",
    "plt.scatter(X[y == 1, 0], X[y == 1, 1], c='green', label='Comedy')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8, label='New User')\n",
    "\n",
    "# 计算新数据点的最近邻\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]]  # 获取最近邻点的坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y_val in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y_val+0.1, f'({x}, {y_val})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0, 0], new_user[0, 1]+0.1, f'({new_user[0, 0]}, {new_user[0, 1]})')\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.10"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
